# Darren
# 2025年02月20日19时34分45秒
# 异常
def use_else_finally():
    try:  # 检测模块
        num = int(input("请输入整数："))
        result = 8 / num
        print(result)
    except ValueError:  # 不同类型异常的处理程序
        print("请输入正确的整数")
    except ZeroDivisionError:
        print("除 0 错误")
    except Exception as e:  # 其他异常
        print(e)
    else:  # 检测区正常执行运行的代码
        print("正常执行")
        return result
    finally:  # 无论是否有异常，都会执行的代码 （不受 return 影响）
        print("执行完成，但是不保证正确")


# use_else_finally()

# 捕获异常发生的文件（模块）和具体行数
def except_pos(e):
    print(e)  # 异常类型
    print(e.__traceback__.tb_frame.f_globals["__file__"])  # 发生异常所在的文件
    print(e.__traceback__.tb_lineno)  # 发生异常所在的行数


try:
    1 / 0
except Exception as e:
    except_pos(e)


# 异常传递 当 函数/方法 执行 出现异常，会 将异常传递 给 函数/方法的 调用一方
# 如果 传递到主程序，仍然没有异常处理，程序才会被终止
def demo1():
    return int(input("输入整数："))


def demo2():
    return demo1()


# 利用异常的传递性，在主程序捕获异常
# try:
#     print(demo2())
# except Exception as result:
#     print("未知错误 %s" % result)


# 抛出(raise)异常
def input_password():
    # 1. 提示用户输入密码
    pwd = input("请输入密码：")
    # 2. 判断密码长度 >= 8，返回用户输入的密码
    if len(pwd) >= 8:
        return pwd
    # 3. 如果 < 8 主动抛出异常
    print("主动抛出异常")
    # 1> 创建异常对象 - 可以使用错误信息字符串作为参数
    ex = Exception("密码长度不够")
    # 2> 主动抛出异常 raise关键字
    raise ex


try:
    print(input_password())
except Exception as e:
    print(e)


# 断言异常 assert
def input_password1():
    pwd = input("请输入密码：")
    assert len(pwd) >= 8, "密码少于8位"  # assert 后判断为假，抛出断言异常 ，提示错误信息
    return pwd


# try:
#     print(input_password1())
# except Exception as e:
#     print(e)


